package 回溯;
import java.util.List;

import org.junit.Test;

import java.util.ArrayList;
//效率 慢  我感觉主要是 String 在 拼接字符串的 时候的速度慢 StringBuilder 会快一点
public class leetcode17电话号码组合 {
	public static void main(String []args) {
		System.out.println("hello world");
		//System.out.println(solution("24"));
//		process(0,"3");
//		System.out.println(ans);
		System.out.println(solutionNew("23"));
	}
	public static List<String> solution(String s){
		//String arr[]= new String[8];
		String arr[] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
		List <String> ans=new ArrayList<>();
		if(s=="") {
			return ans;
		}
	 process(arr,0,ans,"",s);
	 return ans;
	}
	public static void process(String [] a,int index,List<String> ans,String s,String question) {
		if(index ==question.length() ) {
			ans.add(s);
			return ;
		}
//		String str=s;
//		for(int i='a' +(a[index] -'2')* 3;i <='c' +(a[index]-'2')*3 ; i++) {
//			  process(a,index+1,ans,str+(char)i);
//		}

		String str=s;// 这是 不可 避免的 操作 的说实话  
		// 上行代码 多去思考一下 为什么
		for(int i = 0; i<a[question.charAt(index)-'2'].length();i++  ) {
			process(a,index+1,ans,str+a[question.charAt(index)-'2'].charAt(i),question);
		}
	}
	 static String arr[] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
	static List<String> ans=new ArrayList<>();
//	       这还有个 小的   细节 在这里  
	static StringBuilder path= new StringBuilder(26);
	public static  void process(int index,String s) {
		if(index==s.length()) {
			ans.add(path.toString());
			return ;
		}
		String str=arr[s.charAt(index)-'2'];
		for(int i=0; i< str.length();i++) {
			path.append(str.charAt(i));
			process(index+1,s);
			path.deleteCharAt(path.length()-1);
		}
	}
//	***********************************************************
/**
 * 	二刷        这种 题 还是 要 多注意 一下的  
 * 集合 中 的 元素 又是  以 一个 集合的形式 存在的  我靠   这还是 有点 小麻烦的 说实话 
 * @param index
 * @param s
 */
	public static void answer(int index,String s) {
		if(index == s.length()) {
//			return new String(value, 0, count);  这是 开辟 了 一个新的 地址
			ans.add(path.toString());
			return ;
		}
		String str  = arr[s.charAt(index)-'2'];
		for(int i = 0;i < str.length();i++) {
//			path.append(arr[s.charAt(index)].charAt(i));
			path.append(str.length());
			answer(index+1,s);
			path.deleteCharAt(path.length()-1);
		}
	}
	
/**
 * 20220930
 * 更新	
 */
	
	public static List<String> solutionNew(String s){
		List<String> ans = new ArrayList<>();
		String map [] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
		StringBuilder path = new StringBuilder();
		process(ans,path,map,0,s);
		return ans;
		
	}
private static void process(List<String> ans2, StringBuilder path2, String[] map, int index,String s) {
		if(index == s.length()) {
			ans2.add(path2.toString());
			return ;
		}
		String temp = map[s.charAt(index) - '0'];
	for(int  i = 0;i < temp.length();i++) {
		path2.append(temp.charAt(i));
		process(ans2,path2,map,index + 1,s);
		path2.deleteCharAt(path2.length() - 1);
	}
}
	@Test
	public void testsolutionNew() {
		String s = "23";
		System.out.println(solutionNew(s));
	}
	
}